//====================================
// Parsing tag < ${name} >
// ====================================
HRESULT ${className}::Read${name}( CATIDOMElement * ipElement, ${baseName}${name} *& op${name})  
{
	HRESULT hr = E_FAIL ; 

	op${name} = new  ${baseName}${name}() ; 
<#list Attributes as attr>
<#if attr.list != "y" >
	CATUnicodeString  str${attr.name} ; 
	<#if attr.nodeType == "attr" >
	hr = ipElement->GetAttribute( "${attr.tag}", str${attr.name}) ; 
	op${name}->Set${attr.name}( str${attr.name} ) ; 
	<#elseif attr.nodeType ==  "text">
	hr = GetElementValue( ipElement, "${attr.tag}", str${attr.name}) ; 
	op${name}->Set${attr.name}( str${attr.name} ) ; 
	<#elseif attr.nodeType ==  "attrText">
    CATIDOMElement_var spDOM${attr.name} ;
    hr = GetElement( ipElement, "${attr.tag}", spDOM${attr.name}) ;
    if( FAILED(hr) )
    {
        return hr;
    }
	
	hr = spDOM${attr.name}->GetAttribute( "${attr.nodeTag}", str${attr.name}) ; 
	op${name}->Set${attr.name}( str${attr.name} ) ; 
	<#else>
    CATIDOMElement_var spDOM${attr.name} ;
    hr = GetElement( ipElement, "${attr.tag}", spDOM${attr.name}) ;
    if( FAILED(hr) )
    {
        return hr;
    }
	
	${baseName}${attr.type} * p${attr.name} = NULL ;
	hr = Read${attr.name}(spDOM${attr.name}, p${attr.name}) ;
	op${name}->Set${attr.name}( p${attr.name} ) ; 
	</#if>
	if( FAILED(hr) ) 
	{ 
		return hr;                
	}
<#else>
	 CATIDOMNodeList_var spListNodes${attr.name} ;
     hr = ipParent->GetElementsByTagName( "${attr.tag}",  spListNodes${attr.name});
  <#switch attr.type>
	<#case "int">
	<#case "double">
	<#case "long">
	<#case "CATUnicodeString">
	
	 for( int i =0 ; i++)
	 {
		CATIDOMElement_var spElement ;
		spListNodes${attr.name}->GetItem(i, spElement) ;
		
		CATUnicodeString  str${attr.name} ;

		hr = GetElementValue(spElement, str${attr.name}) ;
		if( FAILED(hr) ) 
		{ 
			continue;                
		}
		op${name}->Append${attr.name}(str${attr.name}) ;
	 }
	<#break>
	<#default>
	
	${baseName}${attr.type}List * pList${attr.name} = new ${baseName}${attr.type}List () ;
		
	 for( int i =0 ; i++)
	 {
		CATIDOMElement_var spElement ;
		spListNodes${attr.name}->GetItem(i, spElement) ;
		
		${baseName}${attr.type} * p${attr.name} = NULL ;
		hr = Read${attr.name}(spElement, p${attr.name}) ;
		if( FAILED(hr) ) 
		{ 
			continue;                
		}
		
		pList${attr.name}->Append(p${attr.name}) ;
	 }
	 
	op${name}->Set${attr.name}( pList${attr.name} ) ; 
	</#switch>
</#if>
</#list>
 
 return hr ; 
}
